import re

from apps.users.models import User


def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    """
    return {
        'token': token,
        'id': user.id,
        'username': user.username,
        'avatar': user.avatar
    }

"""
产品的需求是:用户不仅可以通过用户实现登录,也可以通过手机号码实现登录
问题:我们的登录时采用的JWT,JWT的认证也是使用系统的认证,
先认证成功再生成Token

结合我们的问题和需求:
1.我们需要重写 认证后端
2.我们需要在认证后端中,判断用户输入的是手机号还是用户名
"""
"""
抽取(封装)
0.目的:
    解耦
1.原则:
    ① 部分代码实现了一个小功能
    ② 重复性的代码(第二次出现的代码)
2.步骤:
    ① 定义一个方法,将要抽取的代码复制到这个方法中(抽取的代码注释,不要删除)
    ② 复制的代码,哪里有问题改哪里,缺少的变量以参数的定义
    ③ 验证,验证成功之后,再将抽取的代码删掉
"""
"""
产品的需求是:用户不仅可以通过用户实现登录,也可以通过手机号码实现登录
问题:我们的登录时采用的JWT,JWT的认证也是使用系统的认证,
先认证成功再生成Token
"""
from django.contrib.auth.backends import ModelBackend

def get_user_by_account(username):
    """
    如果有变化的话只需要在这里面改变,对认证类没有影响
    :param username:
    :return:
    """
    try:
        if re.match(r'1[3-9]\d{9}', username):
            user = User.objects.get(mobile=username)
        else:
            user = User.objects.get(username=username)
    except User.DoesNotExist:
        return None

    return user

class UsernameModelBackend(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):

        # 1. 判断用户输入的是手机号还是用户名
        # 我们需要相应的条件查询 用户信息
        user = get_user_by_account(username)

        # # 2.查询出用户信息后,只需要根据密码验证一下就可以
        if user is not None and user.check_password(password):
            return user